package com.hy.fangZhou.websocket;//package com.hy.websocket;

import com.hy.fangZhou.utils.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;

@Component
public class WebSocketMsg {

    @Resource
    private MyWebSocket webSocket;

    @Resource
    private RedisUtil redisUtil;

    /**
     * @param name    key
     * @param unValue 未处理的值
     * @param boxId   盒子id
     * @param type
     * @param bit     保留位数
     */
    public void sendData(String name, String unValue, String boxId, int type, int bit) {
        /** 排除unValue 为空值的情况 */
        if (StringUtils.isBlank(unValue)) {
            unValue = "0";
        }
        /** 处理数字可能携带单位的问题 */
        String deal = removeUnit(unValue);
        // 将字符串转换为 BigDecimal
        BigDecimal decimal = new BigDecimal(deal);
        String value = "";

        switch (type) {
            case 0:
                /** 保留数字小数点后bit位 */
                value = decimal.setScale(bit, BigDecimal.ROUND_HALF_UP).toString();
                break;
            case 1:
                /** 小数点往前推一位 并保留bit位小数 */
                value = decimal.divide(new BigDecimal("10"), bit, RoundingMode.HALF_UP).toString();
                break;
            case 2:
                /** 小数点往前推两位位 并保留bit位小数 */
                value = decimal.divide(new BigDecimal("100"), bit, RoundingMode.HALF_UP).toString();
                break;
            default:
                break;
        }

        if (MyWebSocket.getWebSocketSet().get(boxId) != null) {
            webSocket.sendtoUser(name + ":" + value, boxId);
        }
        //缓存数据
        redisUtil.hset(boxId, name, value);
    }

    public String removeUnit(String input) {
        // 通过非数字字符分割，取第一个有效数字段
        String[] parts = input.split("[^0-9.-]+");
        for (String part : parts) {
            if (!part.isEmpty() && (part.matches("[+-]?\\d+(\\.\\d+)?"))) {
                return part;
            }
        }
        return input;
    }
}
